import type { VNode } from 'vue';
import { PageRequest, PageData, FilterGroup } from '@/utils/common/types';
import { propTypes } from '@/utils/propTypes';
import type { ListItemLayout, ListLocale, ListSize } from 'ant-design-vue/lib/list';
import type { PaginationProps } from 'ant-design-vue/lib/pagination';
import { ListGridType } from 'ant-design-vue/lib/list';
import type { ButtonProps } from '@/components/Form';
import type { AdDetailFormProps } from '@/components/AdTable/src/types/adDetailForm';

import componentSetting from '@/settings/componentSetting';
import { FetchSetting, SorterResult } from '@/components/Table';
import { AdColumn } from '@/components/AdTable';
import type { ListSetting } from './types/adList';

const { table } = componentSetting;

const { fetchSetting, defaultSortFn, defaultFilterFn } = table;

export const adListProps = {
  /** 高度变量，计算高度的偏移。 */
  heightOffset: propTypes.number.def(0),
  /** 是否显示边框 */
  bordered: propTypes.bool.def(false),
  /** 列表数据源 */
  dataSource: {
    type: Array as PropType<Recordable[]>,
    default: null,
  },
  // /** 列表底部 */
  // footer: propTypes.object.def(undefined),
  /** 列表栅格配置 */
  grid: {
    type: Object as PropType<ListGridType>,
    default: undefined,
  },
  // /** 列表头部 */
  // header: propTypes.object.def(undefined),
  /** 设置 List.Item 布局, 设置成 vertical 则竖直样式显示, 默认横排 */
  itemLayout: {
    type: String as PropType<ListItemLayout>,
    default: undefined,
  },
  /** 当卡片内容还在加载中时，可以用 loading 展示一个占位 */
  loading: { type: Boolean, default: undefined },
  // /** 加载更多 */
  // loadMore: {
  //   type: Object as PropType<any>,
  //   default: undefined,
  // },
  /** 默认文案设置，目前包括空数据文案 */
  locale: {
    type: Object as PropType<ListLocale>,
    default: undefined,
  },
  /** 对应的 pagination 配置(https://www.antdv.com/components/pagination-cn/#API), 设置 false 不显示 */
  pagination: {
    type: [Boolean, Object] as PropType<boolean | PaginationProps>,
    default: undefined,
  },
  /** 自定义Item函数，也可使用 #renderItem="{item, index}" */
  renderItem: {
    type: Function as PropType<({ item, index }) => Promise<VNode>>,
    default: undefined,
  },
  /** 各项 key 的取值，可以是字符串或一个函数 */
  rowKey: {
    type: [String, Number, Function] as PropType<
      (string | number) | ((item: any) => string | number)
    >,
    default: undefined,
  },
  /** list 的尺寸 */
  size: {
    type: String as PropType<ListSize>,
    default: undefined,
  },
  /** 是否展示分割线 */
  split: propTypes.bool.def(true),

  /** 列表设置 */
  listSetting: {
    type: [Boolean, Object] as PropType<boolean | ListSetting>,
    default: undefined,
  },

  // 自定义排序方法
  sortFn: {
    type: Function as PropType<(sortInfo: SorterResult) => any>,
    default: defaultSortFn,
  },
  // 筛选方法
  filterFn: {
    type: Function as PropType<(data: Partial<Recordable<string[]>>) => any>,
    default: defaultFilterFn,
  },
  // 取消默认padding
  inset: propTypes.bool.def(undefined),
  // 是否自动生成key
  autoCreateKey: { type: Boolean, default: true },
  // 计算合计行的方法
  summaryFunc: {
    type: [Function, Array] as PropType<(...arg: any[]) => any[]>,
    default: null,
  },
  // 自定义合计表格内容
  summaryData: {
    type: Array as PropType<Recordable[]>,
    default: null,
  },
  // 是否显示合计行
  showSummary: propTypes.bool.def(undefined),
  // 请求之前处理参数
  beforeFetch: {
    type: Function as PropType<Fn>,
    default: null,
  },
  // 自定义处理接口返回参数
  afterFetch: {
    type: Function as PropType<Fn>,
    default: null,
  },
  // 查询条件请求之前处理
  handleSearchInfoFn: {
    type: Function as PropType<Fn>,
    default: null,
  },
  // 请求接口配置
  fetchSetting: {
    type: Object as PropType<FetchSetting>,
    default: () => {
      return fetchSetting;
    },
  },
  // 立即请求接口
  immediate: { type: Boolean, default: true },
  // 在开起搜索表单的时候，如果没有数据是否显示
  emptyDataIsShow: { type: Boolean, default: true },
  // 默认的排序参数
  defSort: {
    type: Object as PropType<Recordable>,
    default: null,
  },
  // 是否继承父级高度（父级高度-表单高度-padding高度）
  isCanResizeParent: { type: Boolean, default: false },
  // 是否可以自适应高度
  canResize: { type: Boolean, default: true },
  // 是否紧凑型高度
  compactHeight: { type: Boolean, default: false },
  // 自适应高度偏移， 计算结果-偏移量
  resizeHeightOffset: propTypes.number.def(0),
  // 标题
  title: {
    type: [String, Function] as PropType<string | ((data: Recordable) => string)>,
    default: null,
  },
  // 标题右侧提示
  titleHelpMessage: {
    type: [String, Array] as PropType<string | string[]>,
  },
  // 列表滚动最大高度
  maxHeight: propTypes.number,

  /** 表格数据接口请求对象 */
  api: {
    type: Function as PropType<(params: PageRequest) => Promise<PageData | any>>,
    default: null,
  },
  /** 额外的请求参数 */
  searchInfo: {
    type: Object as PropType<FilterGroup>,
    default: null,
  },
  /** 列配置 */
  columns: {
    type: Array as PropType<AdColumn[]>,
    default: () => [],
  },
  /** 搜索表单 */
  searchForm: {
    type: [Boolean, Object] as PropType<
      | boolean
      | {
          /** 在INPUT组件上单击回车时，是否自动提交 */
          autoSubmitOnEnter?: boolean;
          /** 是否在重置时重新发起请求 */
          submitOnReset?: boolean;
          /** 提交按钮配置 */
          submitButtonOptions?: ButtonProps;
        }
    >,
    default: { autoSubmitOnEnter: true, submitOnReset: true, submitButtonOptions: {} },
  },
  /** 详情表单 */
  detailForm: {
    type: Object as PropType<AdDetailFormProps>,
    default: null,
  },
};
